package com.sky.d_lock_free;

import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicIntegerFieldUpdater;

/**
 * 比如原本有一个变量是int型，并且很多地方都应用了这个变量，但是在某个场景下，
 * 想让int型变成AtomicInteger，但是如果直接改类型，就要改其他地方的应用。AtomicIntegerFieldUpdater就是为了解决这样的问题产生的
 * @Author:hjt
 */
public class AtomicIntegerFieldUpdaterDemo {

	public static class V{
		int id;
		volatile int score;
		
		public int getScore(){
			return score;
		}
		public void setScore(int score){
			this.score = score;
		}
	}
	
	//将score使用 AtomicIntegerFieldUpdater变成 AtomicInteger。保证了线程安全
	public static AtomicIntegerFieldUpdater<V> va = AtomicIntegerFieldUpdater.newUpdater(V.class, "score");
	//使用allscore来验证，如果score和allscore数值相同，则说明是线程安全的
	public static AtomicInteger allscore = new AtomicInteger(0);
	
	public static void main(String[] args) throws InterruptedException {
		final V student = new V();
		Thread[] t = new Thread[10000];
		for (int i=0;i<10000;i++){
			t[i] = new Thread(){
				@Override
				public void run() {
					if(Math.random() > 0.4){
						va.incrementAndGet(student);
						allscore.incrementAndGet();
					}
				}
			};
			t[i].start();
		}
		
		for (int i=0;i<10000;i++){
			t[i].join();
		}
		
		System.out.println("score=" + student.getScore());
		System.out.println("allscore=" + allscore);
	}
	
}
